// el-input限制不允许输入特殊字符，特殊字符支持自定义。使用示例：v-filter-special-chars="['$', '%', '^']"
export default {
  bind(el, binding, vnode) {
    el = el.nodeName === "INPUT" ? el : el.children[0]
    let lock = false // 标记是否需要锁定输入框
    let isHandling = false // 标记是否正在处理
    let lastValue = null
    const invalidChars = binding.value
    const handler = () => {
      if (lock) return // 如果当前为锁定状态，则不进行处理
      if (isHandling) return // 如果已经在处理中，则不进行处理
      if (el.value === lastValue) return // 输入内容没有变化，则不进行处理
      isHandling = true // 设置标记为处理中
      const filteredValue = el.value
        .split("")
        .filter((n) => !invalidChars.includes(n))
        .join("")
      el.value = filteredValue
      lastValue = el.value
      Promise.resolve().then(() => {
        el.dispatchEvent(new Event("input"))
      })
      isHandling = false // 处理完毕后设置标记为非处理状态
    }
    el.addEventListener("input", handler)
    el.addEventListener("compositionstart", () => {
      lock = true
    })
    el.addEventListener("compositionend", () => {
      lock = false
      el.dispatchEvent(new Event("input"))
    })
    vnode.context.$once("hook:destroyed", () => {
      el.removeEventListener("input", handler)
    })
  },
}
